iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
0
自我挑戰組

每日解題日記 (不寫 easy)系列 第 7

D7 - 1318. Minimum Flips to Make a OR b Equal to c

  • 分享至 

  • xImage
  •  

題目

題目大意

有三個數字 a, b, c,今天可以修改 a 和 b,回傳至少要修改幾個 bit,才能使 a or b == c。
例如 a = 2 (0010), b = 6 (0110), c = 5 (0101) 時,需要將 2 和 6 的右邊數來第二個 bit 改為 0,再把 a 或 b 任意一個數字的右邊數來第一個 bit 改為 1,總共修改 3 個。

想法

若 c 的第 k 個 bit 為 0,則 a 和 b 個第 k 個 bit 都要為 1;否則 a 和 b 最多只需要改 1 個即可。
把三個數字分別轉 2 進位太麻煩,直接從 0 開始 31 個 bit 一個個看就好,不用 32 個是因為題目保證是正數,int 的第一個 bit 是用來表示 sign (正負號) 的,所以那個 bit 不會需要修改。

Code(C++)

int minFlips(int a, int b, int c) {
    int ans = 0;
    for(int i=0; i<31; i++) {
        bool ba = a & (1 << i), bb = b & (1 << i), bc = c & (1 << i);
        if ((ba | bb) == bc) continue;
        if (!bc) ans += ba + bb;
        else ans++;
    }
    return ans;
}

心得

這題應該要去 easy 的,印象中寫過不少 medium 的題目都有用到看 bit 的技巧,而且這題我的 code 時間 100%,應該這是最佳寫法了,而這個寫法在很多題目都只是隨手寫出來的東西,所以我覺得他該去 easy 而不是 medium。


上一篇
D6 - 449. Serialize and Deserialize BST
下一篇
D8 - 44. Wildcard Matching
系列文
每日解題日記 (不寫 easy)9
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言